package spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 注解式aop
 * @author：涂有
 * @date 2017年3月6日 下午1:14:35
 */
@Aspect //指定这是一个切面类
@Component //要配置这个，表明这个是受spring管理的bean，否则切面不起作用
public class Aop1 {

	public static final String pointCut = "execution(* spring.bean.*.say(..))";

	//advice增强
	@Before(pointCut)
	public void before(JoinPoint point){
		
		System.out.println("方法执行之前:" + point.getSignature());
	}
	
	/**
	 * 不管方法是否抛异常，都会执行
	 * @author：涂有
	 * @date 2017年3月6日 下午1:35:21
	 */
	@After(pointCut)
	public void after(JoinPoint point){
		
		System.out.println("方法执行之后" + point.getSignature());
	}
	
	@Around(pointCut)
	public void around(ProceedingJoinPoint jp) throws Throwable {
		
		jp.proceed();
	}
	
	/**
	 * 方法正常执行完毕才调用
	 * @author：涂有
	 * @date 2017年3月6日 下午1:35:06
	 */
	@AfterReturning(value=pointCut, returning="ret") //必须指定returning参数，否则报错
	public void afterReturning(JoinPoint point, Object ret){
		
		System.out.println("方法返回之后:" + point.getSignature() + ":" + ret);
	}
	
	@AfterThrowing(value=pointCut, throwing="ex") //必须指定throwing参数，否则报错
	public void afterThrowing(JoinPoint point, Exception ex){
		
		System.out.println("方法抛异常后:" + point.getSignature());
		ex.printStackTrace();
	}
}
